/**
 * @param {number} n
 * @return {number}
 */
export var numPrimeArrangements = function (n) {
  // 找出所有质数的个数
  let primeLen = 0
  for (var i = 2; i <= n; i++) {
    if (isPrimeNum(i)) primeLen++
  }
  // 非质数的个数
  let nonPrimeLen = n - primeLen
  // 总排列数 = 质数的排列数 * 非质数的排列数
  return Number((fatorial(primeLen) * fatorial(nonPrimeLen)) % BigInt(10 ** 9 + 7))
}

// 查询是否质数
function isPrimeNum(n) {
  if (n <= 1) return false
  for (let i = 2; i * i <= n; i++) {
    if (n % i === 0) return false
  }
  return true
}

// 阶乘计算（排列数计算）
function fatorial(n) {
  n = BigInt(n)
  let res = BigInt(1)
  for (let i = 2; i <= n; i++) {
    // res %= (10 ** 9 + 7)
    res *= BigInt(i)
  }
  return res % BigInt(10 ** 9 + 7)
}
